const obj ={
    name:"why",
    age:18
}

// Object.defineProperty(obj,"name",{
//     get:function(){
//         console.log("监听到obj对象的name属性被访问了")
//     },
//     set:function(){
//         console.log("监听到obj对象的name属性被设置值")
//     }
// })

Object.keys(obj).forEach(key=>{
    let value = obj[key]
    Object.defineProperty(obj,key,{
        get:function(){
            console.log(`监听到obj对象的${key}属性被访问了`)
            return value
        },
        set:function(newValue){
            console.log(`监听到obj对象的${key}属性被设置了`)
            value =  newValue
        }
    })
})




// console.log(obj.name)
obj.name = "kobe"
obj.age =30

console.log(obj.name)
console.log(obj.age)

// 有一个对象，我们希望监听到这个对象中的属性被设置或获取的过程
// 可以通过以上的方式：
// 缺点：Object.defineProperty设计的初衷，不是为了监听截止一个对象中
// 所有的属性的。
// 我们在定义某些属性的时候，初衷其实是定义普通的属性，但是后面我们强行将它
// 变成数据属性描述符
// 其次，如果我们想监听更加丰富的操作，比如新增属性，删除属性，那么Object.defineProperty是无能为力的
// 存储数据描述符设计的初衷并不是为了去监听一个完整的对象
